#include "bsp_exit.h"

/* 4个IO口设置为边沿中断检测,再读取电平状态,从而解析格雷码*/
void BSP_IO_Input_Init(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    
    ///< 打开GPIO外设时钟门控
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    
    ///< 端口方向配置->输入
    stcGpioCfg.enDir = GpioDirIn;
	
    ///< 端口驱动能力配置->高驱动能力
    ///stcGpioCfg.enDrv = GpioDrvL;
	
    ///< 端口上下拉配置->无
    stcGpioCfg.enPu = GpioPuDisable;
    stcGpioCfg.enPd = GpioPdDisable;
    ///< 端口开漏输出配置->开漏输出关闭
    stcGpioCfg.enOD = GpioOdDisable;
    ///< 端口输入/输出值寄存器总线控制模式配置->AHB
    stcGpioCfg.enCtrlMode = GpioAHB;
    ///< GPIO IO USER KEY初始化
    
	Gpio_Init(GpioPortA, GpioPin0, &stcGpioCfg);

	Gpio_Init(GpioPortA, GpioPin1, &stcGpioCfg);
	
	Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
	
	Gpio_Init(GpioPortA, GpioPin3, &stcGpioCfg);
	
	/* 双边沿触发中断*/
	Gpio_EnableIrq(GpioPortA, GpioPin0, GpioIrqFalling);	
	Gpio_EnableIrq(GpioPortA, GpioPin0, GpioIrqRising);
	
	/* 双边沿触发中断*/
	Gpio_EnableIrq(GpioPortA, GpioPin1, GpioIrqFalling);	
	Gpio_EnableIrq(GpioPortA, GpioPin1, GpioIrqRising);
	
	/* 双边沿触发中断*/
	Gpio_EnableIrq(GpioPortA, GpioPin2, GpioIrqFalling);	
	Gpio_EnableIrq(GpioPortA, GpioPin2, GpioIrqRising);
	
	/* 双边沿触发中断*/
	Gpio_EnableIrq(GpioPortA, GpioPin3, GpioIrqFalling);	
	Gpio_EnableIrq(GpioPortA, GpioPin3, GpioIrqRising);
	
	///< 使能端口PORTA系统中断
    EnableNvic(PORTA_IRQn, IrqLevel3, TRUE); 
}


///< PortA中断服务函数
void PortA_IRQHandler(void)
{
	if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin0))
    {            
		if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin0))
		{
			 ///< LED点亮
			Gpio_SetIO(EVB_LEDR_PORT, EVB_LEDR_PIN);
		}
		else
		{	
			   ///< LED关闭
			Gpio_ClrIO(EVB_LEDR_PORT, EVB_LEDR_PIN);
		}

        Gpio_ClearIrq(GpioPortA, GpioPin0);    
    }

	if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin1))
    {            

		if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin1))
		{
			 ///< LED点亮
			Gpio_SetIO(EVB_LEDY_PORT, EVB_LEDY_PIN);
		}
		else
		{	
			 ///< LED关闭
			Gpio_ClrIO(EVB_LEDY_PORT, EVB_LEDY_PIN);
		}
        Gpio_ClearIrq(GpioPortA, GpioPin1);    
    }

	if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin2))
    {            

		if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin2))
		{
			 ///< LED点亮
			Gpio_SetIO(EVB_LEDG_PORT, EVB_LEDG_PIN);
		}
		else
		{	
			///< LED关闭
			Gpio_ClrIO(EVB_LEDG_PORT, EVB_LEDG_PIN);
		}
        Gpio_ClearIrq(GpioPortA, GpioPin2);    
    }

	if(TRUE == Gpio_GetIrqStatus(GpioPortA, GpioPin3))
    {            
		if (FALSE == Gpio_GetInputIO(GpioPortA, GpioPin3))
		{
			 ///< LED点亮
			Gpio_SetIO(EVB_LEDB_PORT, EVB_LEDB_PIN);
		}
		else
		{	
			///< LED关闭
			Gpio_ClrIO(EVB_LEDB_PORT, EVB_LEDB_PIN);
		}
        Gpio_ClearIrq(GpioPortA, GpioPin3);    
    }
}  




